﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;

namespace Entidades.Sistema.Venta
{
    public class Pedido
    {
        private int _idPedido;
        private PedidosEstado _estado;
        private DateTime _fecha;
        private DateTime _fechaEntrega;
        private Cliente _cliente;
        private Decimal _importeDescuento;
        private List<DetallePedido> _detellePedido;

        public Pedido()
        {
            _detellePedido = new List<Entidades.Sistema.Venta.DetallePedido>();
            _importeDescuento = 0;
            Cliente = new Cliente();
        }

        public int IdPedido
        {
            get { return _idPedido; }
            set { _idPedido = value; }
        }

        public PedidosEstado Estado
        {
            get { return _estado; }
            set { _estado = value; }
        }

        public DateTime Fecha
        {
            get { return _fecha; }
            set { _fecha = value; }
        }

        public DateTime FechaEntrega
        {
            get { return _fechaEntrega; }
            set { _fechaEntrega = value; }
        }
        public Decimal ImporteDescuento
        {
            get { return _importeDescuento; }
            set { _importeDescuento = value; }
        }
        [Required(ErrorMessage = "Cliente Es Requerido")]
        public Cliente Cliente
        {
            get { return _cliente; }
            set { _cliente = value; }
        }       
        
        public IList<DetallePedido> DetallePedidos
        {
            get { return _detellePedido; }
        }

        public void AgregarDetalle(Entidades.Sistema.Venta.DetallePedido detped)
        {
            _detellePedido.Add(detped);
        }

        public void EliminarDetalle(Entidades.Sistema.Venta.DetallePedido detped)
        {
            _detellePedido.RemoveAll(x => x.IdDetallePedido == detped.IdDetallePedido);
        }

        public Decimal Total { get { return this._detellePedido.Sum(x => x.Producto.PrecioConIva * x.Cantidad); } }
        public Decimal TotalConDescuento { get { return this._detellePedido.Sum(x => x.Producto.PrecioConIva * x.Cantidad) - this.ImporteDescuento; } }

        public bool PermiteEditar
        {
            get {
                switch (this.Estado)
                {
                    case PedidosEstado.ParcDiagramado:
                    case PedidosEstado.ParcProducido:
                    case PedidosEstado.Diagramado:
                    case PedidosEstado.Producido:
                    case PedidosEstado.PendienteFacturacion:
                    case PedidosEstado.Facturado:
                    case PedidosEstado.Entregado:
                    case PedidosEstado.PendienteEntrega:
                        return false;
                }
                return true;            
            }            
        }
        public bool PermiteEliminar
        {
            get
            {
                switch (this.Estado)
                {
                    case PedidosEstado.ParcDiagramado:
                    case PedidosEstado.ParcProducido:
                    case PedidosEstado.Diagramado:
                    case PedidosEstado.Producido:
                    case PedidosEstado.PendienteFacturacion:
                    case PedidosEstado.Facturado:
                    case PedidosEstado.Entregado:
                    case PedidosEstado.PendienteEntrega:
                        return false;
                }
                return true;
            }
        }
        public string NumeroPedido
        {
            get { return string.Format("PE-0001-{0:d8}",this.IdPedido); }
        }
    }

    public enum PedidosEstado
    {
        Cancelado,
        Creado,
        Diagramado,
        Entregado,
        EstadoPedido,
        [Description("No Entregado")] NoEntregado,
        [Description("Parcialmente Diagramado")] ParcDiagramado,
        [Description("Parcialmente Producido")] ParcProducido,
        [Description("Pendiente Entrega")] PendienteEntrega,
        Producido,
        Facturado,
        PendienteFacturacion
    }
}

